package com.lotusfall.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * JDBC 事务机制：
 * 1、JDBC中的事务是自动提交的，什么是自动提交？
 *      只要执行任意一条DML语句，则自动提交一次，这是JDBC默认的事务行为。
 *      但是在实际的业务当中，通常都是N跳DML语句去联合才能完成的，必须保证它们
 *      这些DMl语句在同一事物中同时成功或同时失败
 * 2、以下程序验证一下JDBC事务的自动提交机制
 *      执行一条，就提交一条
 */
//
public class JDBCTest11 {
    public static void main(String[] args) {
        // 执行SQL
        PreparedStatement ps = null;
        Connection conn = null;
        try {
            // 1、注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            // 2、获取链接
            String url = "jdbc:mysql://127.0.0.1:3306/learn?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false";
            String user = "root";
            String password = "994695";
            conn = DriverManager.getConnection(url,user,password);

            // 3、获取预编译的数据库操作对象
            String sql = "update dept set dname = ? where deptno = ?";
            ps = conn.prepareStatement(sql);
            // 4、执行sql语句
            ps.setString(1, "x部门");
            ps.setInt(2, 40);
            int count = ps.executeUpdate();// 执行第一条
            System.out.println(count);

            // 重新给占位符传值：
            ps.setString(1, "y部门");
            ps.setInt(2, 20);
            count = ps.executeUpdate();  // 执行第二条
            System.out.println(count);
            // 5、处理结果集
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }finally {
            if(ps!=null){
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(conn!=null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
